/*
 * Copyright (C) 2024 ~ 2025 Deepin Technology Co., Ltd.
 *
 * Author:     zhangbingyi <zhangbingyi@uniontech.com>
 *
 * Maintainer: zhangbingyi <zhangbingyi@uniontech.com>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
#pragma once

#include "devcommon_global.h"
#include "cominfo.h"
#include "gsettingkey.h"
#include "comdata.h"

#include <QObject>
#include <QGSettings>

class DBusInvokerInterface;
class SettingsInvokerInterface;

// 安恒/瑞星 标识
const int Das_Security_Type = 0;
const int Rising_Type = 1;

class DBusInvokerInterface;

/// \brief The AntiVirusWork class
/// 病毒查杀数据处理类
class DEVCOMMONSHARED_EXPORT AntiVirusWork : public QObject
{
    Q_OBJECT

public:
    explicit AntiVirusWork(QObject *parent);
    virtual ~AntiVirusWork();

public Q_SLOTS:
    // 扫描 （全盘true/自定义false）
    void doDissection(bool isbAll, QString sPaths);
    // 快速扫描
    void doQuickScan();
    // 修复问题文件
    void requestRepairProblemFile(QString sPath);
    // 信任问题文件 (添加/移除)
    void requestChangeTrustFiles(bool isbAdd, QString sPath);
    // 查询信任文件
    void requestQueryTrustFiles();
    // 隔离问题文件 (添加/移除)
    void requestChangeIsolationFile(bool isbAdd, QString sPath);
    // 查询隔离文件
    void requestQueryIsolationFile();
    // 是否正在操作隔离或信任区文件
    bool isOperatingIsolateTrustFiles();
    // 获取上次扫描时间
    QString lastScanningTime();

    // 获得当前病毒引擎
    EnginType getVriusType();
    // 获取系统架构
    QString getSystemArch();

    // 设置上次扫描时间
    void setLastScanningTime(QString sTime);
    // 以当前时间更新上次扫描时间
    void updateLastScanningTime();

    // 查询版本号是否为最新
    void queryVersionStatus();
    // 更新版本
    void updateVirusSrvVersion();

    // 版本更新
    void requestUpdateVirusDb();
    // 是否正在更新病毒库
    inline bool vdbUpdating() const { return m_updateVdb; }

    // 本地病毒库版本
    inline QString localVdbVersion() { return m_sLocalVdbVer; }
    // 服务器病毒库版本
    inline QString srvVdbVersion() { return m_sSrvVdbVer; }
    inline bool needUpdateVersion() { return m_needUpdate; }
    inline bool vdbVersionChecking() { return m_vdbChecking; }
    // 查杀为处理异常文件
    void scanThreatsFile();

    // 查询信任区的数量
    void selectTrustAreaSize();
    // 查询隔离区域的数量
    void selectIsolationAreaSize();
    // 设置扫描状态
    void setCurrentScanStatus(ScanStatus status);
    // 获得扫描状态
    ScanStatus getCurrentScanStatus();

    // 更新返回按钮
    void updateBackButton();
    // 设置文件大小
    void setScanFileSize(int value, int showValue, bool status);

    // 设置异常处理状态
    void setThreatsOperationStatus(bool flag);
    // 获得异常处理状态
    bool getThreatsOperationStatus();
    // 跳转到应用商店
    void jumpToAppStore();

    // 设置病毒库地址
    void setVriusUpdateAddress(QString address);

    // 离线导入后设置病毒库查杀版本号
    void setVirusImportVersion(const QStringList sVersionList);

    // 从主窗口显示扫描页（从此处统一根据引擎状态判断显示弹窗）
    void showScanFromMainWindow(int type, const QString &path);
    // 显示普通系统通知信息
    bool showNormalNotification(const QString &msg);

    void sendNotifyOpenVdbUpdateDialog(){emit notifyOpenVdbUpdateDialog();}
    void sendNotifyUpdateAntiVirusHomeUI(){emit notifyUpdateAntiVirusHomeUI();}
Q_SIGNALS:
    // 扫描返回信号
    void sendDissectionResult(QString sPath, double dProgress, int iType, QString sDetailInfo);

    // 修复问题文件返回信号
    void sendRepairProblemFileResult(QString sPath);
    // 信任问题文件返回信号
    void sendChangeTrustFilesResult(QString sPath);
    void sendTrustFilesByList(QList<TrustFileInfo> sInfos);
    // 隔离问题文件返回信号
    void sendChangeIsolationFilesResult(QString sPath);
    void sendIsolationFilesByList(QList<TrustFileInfo> sInfos);

    // 版本更新结果
    void updateVdbFinished(bool sus);
    // 查杀未处理异常文件
    void sendRequstScanThreatsFile();
    // 有新的病毒库需要更新
    void haveNewVdb(bool have);
    // 通知打开病毒库更新对话框
    void notifyOpenVdbUpdateDialog();
    // 通知更新病毒查杀首页数据
    void notifyUpdateAntiVirusHomeUI();
    // 发送异常文件列表
    void sendResultWhileScanFinished(QStringList list);

    // 更新返回按钮
    void notifyUpdateBackButton();
    // 更新信任区数量
    void notifyUpdateTrustAreaSize(int size);
    // 更新隔离区数量
    void notifyUpdateIsolationAreaSize(int size);

    // 离线更新后更新界面版本号
    void notifyVirusImportUpdataUi(const QString sVersion);

private Q_SLOTS:
    void onRecDissectionResult(QString sPath, double dProgress, int iType, QString sDetailInfo);
    void onRecTrustFiles(QString sInfos);
    void onRecIsolationFiles(QString sInfos);

    // 接收服务器病毒库版本
    void acceptVirusSrvVersion(const QString &sVersion);
    // 接受服务器病毒库版本延时
    void acceptVirusSrvVersionTimer();

    // 当病毒库更新完成
    void onUpdateVDbFinished(bool isbSus);
    // 接受扫描结束
    void onScanFinished();
    // 病毒引擎扫描状态设置完成时
    void onSetScanStatusFinished(int status);

private:
    // 获得本地病毒库版本
    void readLocalVdbVersion();
    // 获得服务器病毒库版本
    void readSrvVdbVersion();
    // 检查是否需要更新
    bool checkIsNeedUpdate();
    QString getVirusAddress();

private:
    DBusInvokerInterface *m_monitorInterFaceServer; // 安全中心system后台服务
    DBusInvokerInterface *m_virusScanServer; // 病毒查杀服务
    DBusInvokerInterface *m_dataInterFaceServer; // 安全中心session后台服务
    SettingsInvokerInterface *m_gsetting;
    DBusInvokerInterface *m_mainWindowServer; // 主窗口dbus接口
    DBusInvokerInterface *m_notifDBusInter; // 系统通知dbus对象

    QString m_sSrvVdbVer; // 服务版本
    QString m_sLocalVdbVer; // 本地版本
    QStringList m_threatsFileList; // 异常文件列表
    EnginType m_currentEnginType; // 当前引擎
    bool m_threatsOperationStatus; // 异常处理状态
    bool m_updateVdb; // 是否在更新病毒库
    bool m_needUpdate; // 是否需要更新
    bool m_vdbChecking; // 是否正在检查病毒库更新
    bool m_isFlag;

    QString m_systemArchitecture; // 系统架构
};
